﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using CondominioG1.Persistencia.NHibernate;
using CondominioG1.Dominio;
using NHibernate.Criterion;

namespace CondominioG1.Negocio
{

//HISTORIA: 
//Registro una vivienda debo indicar mínimo su ubicación (edificio/zona), número, metraje, tipo (casa/dpto.) y residente propietario.	
//Espero: 
//Confirmación del registro OK.
//Mensaje de error si ya se registró la vivienda.

    public class ViviendaService
    {
        // Dependencias con la capa de persistencia
        public ResidenteDAO ResidenteDAO { get; set; }
        public ViviendaDAO ViviendaDAO { get; set; }

        // Mapeo de funcionalidades
        public Vivienda RegistrarVivienda(String Codigo, String Ubicacion, Int32 Numero, Decimal Metraje, String Tipo, String ResidenteCodigo, String PropietarioCodigo)
        {
            // Validación de Codigo obligatorio
            if (null == Codigo || String.Empty.Equals(Codigo))
                throw new Exception("No se puede registrar una vivienda sin codigo");
            // Validación de existencia de una vivienda con el mismo Codigo
            if (ViviendaDAO.Obtener(Codigo) != null)
                throw new Exception("Ya existe una vivienda con el codigo indicado");
            // Validación de UBICACIÓN
            if (null == Ubicacion || String.Empty.Equals(Ubicacion))
                throw new Exception("El dato UBICACION es obligatorio");
            // Validación de NUMERO
            if (Numero < 0)
                throw new Exception("El dato NUMERO es obligatorio");
            // Validación de METRAJE
            if (Metraje < 40)
                throw new Exception("El metraje es insuficiente");
            // Validación de TIPO
            if (null == Tipo || String.Empty.Equals(Tipo))
                throw new Exception("El dato TIPO es obligatorio");
            //Validación de RESIDENTE
            Residente residente = ResidenteDAO.Obtener(ResidenteCodigo);
            if (residente == null)
                throw new Exception("Residente inexistente");
            //Validación de PROPIETARIO
            Residente propietario = ResidenteDAO.Obtener(PropietarioCodigo);
            if (propietario == null)
                throw new Exception("Propietario inexistente");

            // Generar nueva secuencia para Vivienda
            Vivienda viviendaACrear = new Vivienda();
            viviendaACrear.Codigo = Codigo;
            viviendaACrear.Ubicacion = Ubicacion;
            viviendaACrear.Numero = Numero;
            viviendaACrear.Metraje = Metraje;
            viviendaACrear.Tipo = Tipo;
            viviendaACrear.Residente = residente;
            viviendaACrear.Propietario = propietario;

            Vivienda ViviendaCreado = ViviendaDAO.Crear(viviendaACrear);
            return ViviendaCreado;
        }

        public Vivienda ModificarVivienda(String Codigo, String Ubicacion, Int32 Numero, Decimal Metraje, String Tipo, String ResidenteCodigo, String PropietarioCodigo)
        {
            // Validacion de existencia de Vivienda
            Vivienda ViviendaExistente = ViviendaDAO.Obtener(Codigo);
            if (null == ViviendaExistente)
                throw new Exception("El Vivienda NO EXISTE...");

            // Validación de UBICACIÓN
            if (null == Ubicacion || String.Empty.Equals(Ubicacion))
                throw new Exception("El dato UBICACION es obligatorio");
            // Validación de NUMERO
            if (Numero < 0)
                throw new Exception("El dato NUMERO es obligatorio");
            // Validación de METRAJE
            if (Metraje < 40)
                throw new Exception("El metraje es insuficiente");
            // Validación de TIPO
            if (null == Tipo || String.Empty.Equals(Tipo))
                throw new Exception("El dato TIPO es obligatorio");
            //Validación de RESIDENTE
            Residente residente = ResidenteDAO.Obtener(ResidenteCodigo);
            if (residente == null)
                throw new Exception("Residente inexistente");
            //Validación de PROPIETARIO
            Residente propietario = ResidenteDAO.Obtener(PropietarioCodigo);
            if (propietario == null)
                throw new Exception("Propietario inexistente");

            Vivienda viviendaAModificar = new Vivienda();
            viviendaAModificar.Codigo = Codigo;
            viviendaAModificar.Ubicacion = Ubicacion;
            viviendaAModificar.Numero = Numero;
            viviendaAModificar.Metraje = Metraje;
            viviendaAModificar.Tipo = Tipo;
            viviendaAModificar.Residente = residente;
            viviendaAModificar.Propietario = propietario;

            Vivienda ViviendaModificado = ViviendaDAO.Modificar(viviendaAModificar);
            return ViviendaModificado;
        }
        public ICollection<Vivienda> ListarTodasViviendas()
        {
            return ViviendaDAO.Listar(DetachedCriteria.For<Vivienda>());
        }

        public Vivienda EliminarVivienda(String Codigo)
        {
            // Validacion de existencia de Vivienda
            Vivienda ViviendaExistente = ViviendaDAO.Obtener(Codigo);
            if (null == ViviendaExistente)
                throw new Exception("La Vivienda no existe...");

            Vivienda Vivienda = new Vivienda();
            Vivienda = ViviendaExistente;

            ViviendaDAO.Eliminar(Vivienda);
            return Vivienda;
        }

        public void EliminarViviendas()
        {
            foreach (Vivienda vivienda in ViviendaDAO.Listar(DetachedCriteria.For<Vivienda>()))
                ViviendaDAO.Eliminar(vivienda);
        }
        public Vivienda ObtenerVivienda(String Codigo)
        {
            // Aquí deben ir las validaciones, reglas de negocio, algoritmos, etc.
            return ViviendaDAO.Obtener(Codigo);
        }

        public ICollection<Vivienda> ListarViviendasxUbicacion(String Ubicacion)
        {
            return ViviendaDAO.ListarViviendaPorUbicacion(Ubicacion);
        }
        
    }
}

